package com.share.common.utils;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 01401061 - 孙艳强
 * @date 2020/12/10 19:18
 */
public class StrUtil {

    /**
     * 字符串对齐
     * 33  ->  "033"
     * -3  ->  "-03"
     *
     * @param str
     * @param strLen
     * @return
     */
    public static String strAlign(String str, int strLen) {
        String format = "%" + strLen + "s" ;
        return String.format(format, str);
    }

    /**
     * 数字转字符串对齐
     * 33  ->  "033"
     * -3  ->  "-03"
     *
     * @param num
     * @param strLen
     * @return
     */
    public static String intToStrAlign(int num, int strLen) {
        String format = "%0" + strLen + "d" ;
        return String.format(format, num);
    }


    /**
     * 递归检索到最后
     *
     * @param date
     * @param flags
     * @return
     */
    public static int indexOf(String date, String... flags) {
        int lastIndex = 0;

        if (ArrayUtils.isEmpty(flags)) {
            return lastIndex;
        }

        int size = flags.length;
        for (int i = 0; i < size; i++) {
            int index = date.indexOf(flags[i]);
            if (index < 0) {
                lastIndex = index;
                break;
            } else {
                date = date.substring(index);
                lastIndex += index;
            }
        }
        return lastIndex;
    }

    public static String getValue(Object value, String def) {
        if (value == null) {
            return def;
        } else {
            return value.toString();
        }
    }

    /*把数组里面的值 组合在一起*/
    public static String valueOf(String arr[]) {
        if (arr == null) {
            return null;
        } else {
            StringBuffer sb = new StringBuffer();
            Arrays.stream(arr).forEach(e -> sb.append(e));
            return sb.toString();
        }
    }

    /*去除特殊2变的字符*/
    public static String trim(String value, char ch) {
        if (value == null) {
            return null;
        }

        int len = value.length();
        int st = 0;
        char[] val = value.toCharArray();    /* avoid getfield opcode */

        while ((st < len) && (val[st] == ch)) {
            st++;
        }
        while ((st < len) && (val[len - 1] == ch)) {
            len--;
        }
        return ((st > 0) || (len < value.length())) ? value.substring(st, len) : value;
    }

    /**
     * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写
     *
     * @param cs                  指定字符串
     * @param searchCharSequences 需要检查的字符串数组
     * @return 是否包含任意一个字符串
     */
    public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) {
        if (StringUtils.isEmpty(cs) || StringUtils.isAnyEmpty(searchCharSequences)) {
            return false;
        }
        for (CharSequence testStr : searchCharSequences) {
            if (StringUtils.containsIgnoreCase(cs, testStr)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 拼接set
     * <p>
     * 例如：
     * user_name --> setUser_name
     * User_name --> setUser_name
     */
    public static String linkSetName(String s) {
        if (s == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        sb.append("set");
        char c = s.charAt(0);
        if (c >= 'a' && c <= 'z') {
            sb.append((char) (c - 32));
            sb.append(s.substring(1));
        } else {
            sb.append(s);
        }
        return sb.toString();
    }

    /**
     * 拼接get
     * <p>
     * 例如：
     * user_name --> getUser_name
     * User_name --> getUser_Name
     */
    public static String linkGetName(String s) {
        if (s == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        sb.append("set");
        char c = s.charAt(0);
        if (c >= 'a' && c <= 'z') {
            sb.append((char) (c - 32));
            sb.append(s.substring(1));
        } else {
            sb.append(s);
        }
        return sb.toString();
    }

    /**
     * 下划线转驼峰
     * <p>
     * 例如：
     * user_name --> setUserName
     * User_name --> setUserName
     * User_3ame --> setUser3ame
     */
    public static String under2SetCamel(String s) {
        if (s == null) {
            return null;
        }
        return "set" + under2Camel(s);
    }

    /**
     * 下划线转get驼峰
     * <p>
     * 例如：
     * user_name --> getUserName
     * User_name --> getUserName
     * User_3ame --> getUser3ame
     */
    public static String under2GetCamel(String s) {
        if (s == null) {
            return null;
        }
        return "get" + under2Camel(s);
    }

    /**
     * 下划线转驼峰
     * <p>
     * 例如：
     * user_name --> userName
     * User_name --> UserName
     * User_3ame --> User3ame
     */
    public static String under2Camel(String s) {
        if (s == null) {
            return null;
        }

        boolean toUpper = false;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '_') {
                toUpper = true;
                continue;
            }

            if (toUpper && c >= 'a' && c <= 'z') {
                sb.append((char) (c - 32));
            } else {
                sb.append(c);
            }
            toUpper = false;
        }
        return sb.toString();
    }

    /**
     * 驼峰命名转下划线
     * 跳过第一个字母
     * AA ->  A_a
     */
    public static String camel2under(String str) {
        if (str == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (i > 0) {
                if (c >= 'A' && c <= 'Z') {
                    sb.append("_");
                    sb.append((char) (c + 32));
                } else {
                    sb.append(c);
                }
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 判断字符串中是否包含中文
     *
     * @param str 待校验字符串
     * @return 是否为中文
     * @warn 不能校验是否为中文标点符号
     * eg：
     * 1你0    输出 true
     * 1 0  +，+  输出 false
     */
    public static boolean isContainsChinese(String str) {
        if (str == null) {
            return false;
        }
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 判断字符串中是否全是中文
     *
     * @param str 待校验字符串
     * @return 是否全是中文
     * eg
     * “你， 发的”   “你 发的”   输出 false
     */
    public static boolean isAllChinese(String str) {
        if (str == null) {
            return false;
        }
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]+");
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 金融数字转换为整数
     * <p>
     * int最大数是 2147483647 字符串的长度是10位开头小于3
     * 将"3,433,198,198"  转换为整数3433198198
     * 使用long 型，在金融行业 integer装不下
     *
     * @param money
     * @return
     */
    public static long financeNumToLong(String money) throws ParseException {
        DecimalFormat df = new DecimalFormat("###,###");
        return df.parse(money).longValue();
    }

    /**
     * 将字符串进行切割 只识别字母和数字
     * eg splitNumericAndAlphabet("@453,@41-")  则输出 {"@","453",",@","41","-"}
     *
     * @param str
     * @return
     * @throws ParseException
     */
    public static String[] splitNumericAndAlphabet(String str) {
        if (str == null) {
            return null;
        }

        int len = str.length();
        String upFlag = null;
        StringBuffer sb = new StringBuffer();
        List<String> list = new LinkedList<>();
        for (int i = 0; i < len; i++) {
            char c = str.charAt(i);
            String curFlag = null;
            if (c <= '9' && c >= '0') {
                curFlag = "n" ;
            } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                curFlag = "s" ;
            } else {
                curFlag = "o" ;
            }

            if (upFlag == null) {
                sb.append(c);
            } else {
                if (upFlag.equals(curFlag)) {
                    sb.append(c);
                } else {
                    list.add(sb.toString());

                    //重新开始
                    sb.setLength(0);
                    sb.append(c);
                }
            }
            upFlag = curFlag;
        }

        String last = sb.toString();
        if (last.length() > 0) {
            list.add(last);
        }
        sb.setLength(0);
        sb = null;

        return list.toArray(new String[list.size()]);
    }

    /**
     * 字符串替换  添加转义
     *
     * @param reValue
     * @param des
     * @return
     */
    public static String addEscape(String reValue, char des) {
        if (StringUtils.isBlank(reValue)) {
            return reValue;
        }

        StringBuffer sb = new StringBuffer(reValue);
        int len = sb.length();
        for (int i = len - 1; i >= 0; i--) {
            if (reValue.charAt(i) == des) {
                sb.insert(i, "\\\\");
            }
        }
        return sb.toString();
    }

    /**
     * 是否为整数
     * eg：
     * -111 +22  2 -0 +0都是整数  true
     * 11.1  11-  - 都是非整数 false
     * <p>
     * 备注：Integer.parseInt(" 10 ") jdk识别为非整数, 本工具类返回false
     *
     * @param str
     * @return
     */
    public static boolean isInteger(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }

        int len = str.length();
        for (int i = 0; i < len; i++) {
            char c = str.charAt(i);
            if (i == 0) {
                if (c == '-' || c == '+') {
                    if (len == 1) {
                        return false;
                    }
                    continue;
                }
            }
            if (!Character.isDigit(c)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 是否为整数 小数
     * <p>
     * -111.2 +22  2 -0 +0  .1  33. 都是整数  true
     * 11.1a  1..1  -    都是非整数 false
     * <p>
     * 备注：Double.parseDouble(" 10 ") 这种方式jdk识别为小数, 强掉下 本工具类返回false
     *
     * @param str
     * @return
     */
    public static boolean isDouble(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }

        int dCount = 0;
        int len = str.length();
        for (int i = 0; i < len; i++) {
            char c = str.charAt(i);
            if (i == 0) {
                if (c == '-' || c == '+' || c == '.') {
                    if (len == 1) {
                        return false;
                    }
                    continue;
                }
            }

            if (c == '.') {
                dCount++;
                if (dCount > 1) {
                    return false;
                }
                continue;
            }

            if (!Character.isDigit(c)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(isAllChinese(" 1，0 "));
        System.out.println(isAllChinese(" 1你0 "));
        System.out.println(isAllChinese(" 你 "));
        System.out.println(isAllChinese("你发的，"));

    }
}
